总结
以下知识点太密集,可以先了解场景,依靠场景去记忆头字段。后续遇到再加深印象。
1. 前提提要、场景
前面了解了 Header
头信息的基础规则和伪头,而 Header
包含了请求头、响应头。本章按照分类,大致介绍常见的请求头。
2. 控制相关
Host
: 场景: traefik 网关管理,一个IP
挂载多个子域名,通过Host
区分来源域名,最终分配到不同服务上。Cache-Control
:做为请求头字段时,控制客户端的缓存策略。Expect
:目前规定只有Expect: 100-continue
。场景:通知服务端,客户端即将发送大小为Content-Length
的大文件- 能满足期望:
100(Continue)
- 不能满足期望:
417(Expectation Failed)
- 能满足期望:
Range
:指定范围请求,场景:用于断点续传或音视频传输- 范围有效:
206(Partial Content)
响应。且在响应头中有对应的Content-Range: bytes 4697824-5091876/174754560
(<type> <rangeStart>-<rangeEnd>/<total>)
- 范围无效:
416(Range Not Satisfiable)
错误。 - 服务器也可以忽略
Range
并用200
状态码返回整个资源
- 范围有效:
3. 条件相关
If-Match
/If-None-Match
/If-Modified-Since
:304(Not Modified,未改变)
/412 (Precondition Failed,前置条件失败)
状态码相关If-Range
/Range
:206 (Partial Content,请求成功,部分内容)
/416(Range Not Satisfiable,范围请求无法满足)
状态码相关。
条件请求相关头部
If-Match
:传递ETag
值,ETag
值匹配时才返回资源。GET
/HEAD
方法: 场景:搭配Range
字段,可以用来保证【新请求的范围】与【之前请求的范围】是对同一份资源的请求。 不匹配返回416 (Range Not Satisfiable,范围请求无法满足)
,意味着服务端在这段期间资源有更新。PUT
方法: 场景:更新资源,避免覆盖掉已更新内容。(跟git
远程仓库有更新和本地仓库也有更改,避免覆盖而显示冲突很相似) 上传更新资源时,不匹配返回412 (Precondition Failed,前置条件失败)
,意味着服务端在这段期间资源有更新。
If-None-Match
:传递ETag
值,跟If-Match
相反,ETag
值没有匹配项才返回资源。优先级高于If-Modified-Since
GET
/HEAD
方法:场景:用来更新资源最新的ETag
,且决定了客户端是否继续使用已缓存的资源- 不匹配,返回资源且返回最新的
ETag
(也会尽可能返回Cache-Control、Content-Location、Date、Expires 和 Vary
)。 - 匹配,返回响应码
304(Not Modified,未改变)
。
- 不匹配,返回资源且返回最新的
PUT
(或其它能够引发服务器状态改变的方法):场景:If-None-Match: *
新增资源,避免覆盖资源。(If-Match
目的是更新资源,如果不匹配ETag
资源则412
,而If-None-Match: *
目的是新增资源,一但服务器有该资源,无论Etag
返回412
) 匹配,返回412(Precondition Failed,前置条件失败)
。
If-Modified-Since
:传递Last-Modified
。资源在给定时间之后有更新才200
返回资源。否则304(Not Modified,未改变)
- 只能用于
GET
/HEAD
方法,场景:用于更新没有ETag
的资源,因为If-Modified-Since
优先级低于If-None-Match
- 只能用于
If-Range
:条件请求,条件满足时Range
头字段才起作用。- 场景:断点续传,用来确保下载的资源没有发生改变。否则重新下载
- 满足条件:返回
206 (Partial Content,请求成功,部分内容)
并只返回Range
限定的部分内容; - 条件不满足:返回
200
并返回完整的请求资源If-Range: <ETag>
:满足ETag
同个资源时才会返回部分内容If-Range: <Last-Modified>
:更改时间未超过限制,才会返回部分内容
- 与
If-Match
的区别:If-Match
在不匹配时返回416 (Range Not Satisfiable,范围请求无法满足)
,而If-Range
在不匹配时返回新的整个资源。
4. 内容协商
内容类型(Accept
)、文件编码(Accept-Encoding
)、字符集类型 (Accept-Charset
)、语言(Accept-Language
) 。
场景:客户端向服务端描述需要怎样的资源,
- 满足:
200
- 不满足:
406 (Not Acceptable,不可接受)
服务器端无法提供相匹配的资源。(可以通过一些配置不返回406
如:Accept-Encoding: br;q=1.0, *;q=0
)
请求头字段:
Accept
:客户端可以处理的内容类型,MIME
(媒体类型,一种标准)表示。如:application/json
、application/javascript
、text/html
、image/png
。Accept-Encoding
:客户端可以处理的压缩编码,如:gzip
、br
,不配置则可能不压缩。Accept-Charset
:客户端可以处理的字符集类型,如:utf-8
、iso-8859-1
Accept-Language
:客户端需要的语言,如:en-US
、zh-CN
。
5. 认证相关
Authorization
:每次发送请求时,使用该头部携带token
信息,维护客户端的认证状态。
6. 来源相关
根据来源字段,场景:统计用户信息,也可以用来防止爬虫和防御 CSRF
攻击
Referer
:来源页面的完整地址,即该页面是由哪个页面跳转而来的。(由于可能暴露用户的浏览历史,涉及隐私。有途径可以不发送改头信息,在不发送的情况下可以判断Origin
)Origin
:来源页面的协议、主机、端口(不会像Referer
一样暴露path
不会那么敏感),在跨域或同源(非GET
和非HEAD
) 请求中会带上Origin
。User-Agent
:用户代理,即客户端,比如浏览器版本号之类、命令行工具curl
、http
等